package mymyoux.events
{
	import flash.events.Event;
	import flash.utils.describeType;
	/**
	 * MEventDispatcher est une amélioration de MEventDispatcherLocal permettant d'ajouter des écouteurs "statiques".
	 * @author Mymyoux
	 * @version 1.0
	 */
	public class MEventDispatcher extends mymyoux.events.MEventDispatcherLocal
	{
		 /**
		 * Tableau de MEventDispatcherLocal qui permet d'ajouter un listener sur un evenement dispatché par n'importe quel MEventDispatcher de même classe.
		 */
		protected static var events:Array
		/**
		 * Crée un nouvel objet MEventDispatcher.
		 */
		public function MEventDispatcher()
		{
			if(events==null)
			{
				events=new Array();
			}
			if(events[describeType(this).@name]==null)
			{
				events[describeType(this).@name]=new MEventDispatcherLocal();
			}
		}
		/**
		 * Enregistre un écouteur(listener) sur le MEventDispatcher (static) pour que cet écouteur reçoive les notifications d'un évènement de tous les MEventDispatcher.
		 * Attention : Dans le cas de l'utilisation d'un écouteur static il faut impérativement que l'évènement override <code>"clone()"</code> auquel cas l'évènement perdra son typage.
		 * @see #addEventListener()
		 */
		public function addStaticEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void{
			events[describeType(this).@name].addEventListener(type,listener,useCapture,priority,useWeakReference);
		}
		/**
		 * Supprime un écouteur(listener) du MEventDispatcher (static) pour que cet écouteur ne reçoive plus les notifications d'un évènement.
		 * Attention : Dans le cas de l'utilisation d'un écouteur static il faut impérativement que l'évènement override <code>"clone()"</code> auquel cas l'évènement perdra son typage.
		 * @see #removeEventListener()
		 */ 
		public function removeStaticEventListener(type:String, listener:Function, useCapture:Boolean=false):void{
				events[describeType(this).@name].removeEventListener(type,listener,useCapture);
		}
		/**
		 * @inheritDoc 
		 * @throws Error Renvoie une erreur si l'évènement n'implémente pas <code>IStaticListenable</code> alors qu'il possède un écouteur static.  Lance une erreur si la limite de récursivité à été atteinte.
		 */
		public override function dispatchEvent(event:Event):Boolean
		{      
			if(event is IStaticListenable)
			{
				events[describeType(this).@name].dispatchEvent(event);

			}else
			{
				if((events[describeType(this).@name] as MEventDispatcherLocal).length>0)
				{
						throw(new Error("L'évènement n'est pas de type IStaticListenable, impossible d'utiliser la fonction addStaticEventListener:\nClasse ayant dispatché l'évènement responsable : "+describeType(this).@name)+"\nEvènement responsable : "+event.toString());
				}
			}
			return super.dispatchEvent(event);
		}
		/**
		 * @inheritDoc 
		 */
		public override function removeAllEventListener():void{
			//events[describeType(this).@name].removeAllEventListener();
			super.removeAllEventListener();
		}
		/**
		 * @inheritDoc 
		 */
		public override function get length():uint{
			return super.length+events[describeType(this).@name].length;
		}
	}
}